#define elif else if
#include<bits/stdc++.h>
#include"heap.cpp"
#include"DisjointSetUnion.cpp"
using namespace std;
int* D;
struct edge
{
	int from,to,dis;
	edge(){from=to=dis=-1;}
	edge(int from,int to,int dis)
	{
		this->from=from;
		this->to=to;
		this->dis=dis;
	}
};
struct Comp
{
	static bool prior(edge a,edge b)
	{
		return a.dis<b.dis;
	}
};
int main()
{
	int n,e;
	while(cin>>n>>e)
	{
		edge *E=new edge[e];
		int**input=new int*[e];
		heap<edge,Comp>minheap;
		ParPtrTree pptree(n);
		for(int i=0;i<e;i++)
		{
			input[i]=new int[2];
			int weight=0;
			cin>>input[i][0]>>input[i][1]>>weight;
			E[i]=edge(input[i][0],input[i][1],weight);
			minheap.insert(E[i]);
		}
		int numMST=n;
		E=new edge[n-1];
		for(int i=0;numMST>1;)
		{
			edge tmp=minheap.removefirst();
			int u=tmp.from,v=tmp.to;
			if(pptree.differ(u,v))
			{
				pptree.UNION(u,v);
				numMST--;
				E[i++]=tmp;
			}
		}
		for(int i=0;i<n-1;i++)
		{
			cout<<E[i].from<<" "<<E[i].to<<" "<<E[i].dis<<endl;
		}
	}
}
				
//测试数据：第一行为点数、边数
//以下数据可直接去除注释复制粘贴使用
//其余每行为各点之间的边及其权重
//warning：出发点的输入需要其之间有通路
// 6 8
// 0 2 7
// 0 4 9
// 1 2 5
// 2 3 1
// 2 5 2
// 3 5 2
// 1 5 6
// 4 5 1